/**
* 位运算符和位运算
 * C语言的位运算是：对操作数(整型或字符型)中的每一位二进制数，将0看成假、将1看成真再按相应的逻辑进行运算。
C语言提供的位运算符有：与&、或|、非~、异或^、左移<<、右移>>。
1.“按位与”运算符&
两个操作数相应二进制位同时为1时才为1，如6&5=4。
2. “按位或”运算符|
两个操作数相应二进制位有一个为1时就为1，如6|5=7。
3.“异或”运算符^
两个操作数相应二进制位不相同时为1，相同时为0，如6^5=3。
4.“取反”运算符~
这是一个单目运算符即只能有一个操作数，相应位为1时取反后为0，相应位为0时取反后为1，如~-1=0。需注意的是，~x相当于-x-1，因此，~-1=-(-1)-1=0。
5.左移运算符<<
表达式x<<n表示将数x对应二进制数左移n位，相当于数x对应二进制数右边补n位二进制0，如13<<2=52。需注意的是，x<<n相当于x*2n。
6.右移运算符>>
表达式x>>n表示将数x对应二进制数右移n位，相当于数x对应二进制数右边n位二进制数删除，如13>>2=3。需注意的是，x>>n相当于x/2n。
* @auther zhanglj
* @bug
*/
#include "stdio.h"

/**
*
* @auther zhanglj
* @bug
*/
void test(){
    printf("%d,%d,%d,%d,%d,%d \n",3&5,3|5,3^5,~1,5<<1,12>>2);
}

/**
 *   位段
 *   以位为单位存储，如以下data变量共占存储空间16位，其中a,b,c,d各变量占用存储空间分别为2位、6位、4位、4位。
 *   位段的引用方法与结构成员变量的引用方法相同。如data.a=1;注意data.a只能取0、1、2、3这四个值，因其只占2位存储空间。
 */
 struct packet_data{
     unsigned a:2;
     unsigned b:6;
     unsigned c:4;
     unsigned d:4;
 }data;

 void test_packet_data(){
    data.a=4; //100  最高位1 溢出
    data.b=65; //1000001 最高位1溢出
    data.c=18; //10010 最高位1溢出
    data.d=15; //1111
     printf("%d,%d,%d,%d \n",data.a,data.b,data.c,data.d);
 }

/**
* 入口
* @auther zhanglj
* @bug
*/
int main9(){
    test();
    test_packet_data();
    return 0;
}
